<?php

class SpecialWikevalEtiquetar extends SpecialPage {
    function __construct() {
        parent::__construct( 'WikevalEtiquetar' );
    }
    
    
    function execute( $par ) {
        global $wgRequest, $wgOut, $wgExtensionAssetsPath, $wgUser;
        
        $ruta_extension = "$wgExtensionAssetsPath/wikeval";
        
        $this -> setHeaders();
        
        // Título de la página
        $wgOut -> setPageTitle("Wikeval");
        
        // Hoja de estilos para la fuente de las cabeceras
        $wgOut -> addExtensionStyle('http://fonts.googleapis.com/css?family=Hammersmith+One');
        
        // Hoja de estilos propia
        $wgOut -> addExtensionStyle("$ruta_extension/css/style.css");
        $wgOut -> addExtensionStyle("$ruta_extension/css/estilos_adicionales.css");
       
        // Esto borra el H1 que pone mediawiki por defecto
        $wgOut -> addHeadItem("wikeval_style", '<style type="text/css">/*<![CDATA[*/ .firstHeading { display:none; } /*]]>*/</style>');

        // Fichero de código Javascript
        $wgOut -> addScriptFile("$ruta_extension/js/script.js");
        
        // Contenedor general para evitar el desparrame de contenido a lo largo en pantallas panorámicas
        $wgOut -> addHTML("<div id='wikeval_contenedor'>");
            
        // Cabecera
        $wgOut -> addHTML("<h1 class='wikeval'>Zona de etiquetado</h1>");

        //$wgOut -> addHTML("Acción: " . $wgRequest->getText( 'action' ) . "<br>");
        
        try {
            // Si se ha recibido un post
            if ($this -> getRequest() -> wasPosted()){

                // Guardamos el objeto con el request
                $req = $this -> getRequest();

                // Leemos el número de etiquetas a añadir
                $num_etiquetas = $req -> getInt("num_etiquetas");

                $e_article_id = $req -> getInt("article_id");
                $e_article_rev = $req -> getVal("article_rev");
                $e_user_id = $req -> getVal("user_id");

                // Adquirimos el manejador de la base de datos
                $dbw = wfGetDB( DB_MASTER );

                // Lista de claves
                $claves = array("eval_rub", "eval_con", "eval_prop", "eval_val",
                    "frag_start", "frag_end", "comment");

                // Vector de filas 
                $filas = array();

                // Recorremos las etiquetas
                foreach (range(0, $num_etiquetas - 1) as $i){

                    // Prefijo de los campos de esta etiqueta, con la forma et_0_
                    $pref = "et_" . $i . "_";
                    
                    // Contenedor con los datos de esta etiqueta
                    $fila = array();
                    $fila["article_id"] = $e_article_id;
                    $fila["article_rev"] = $e_article_rev;
                    $fila["user_id"] = $e_user_id;

                    // Recorremos los datos de la etiqueta
                    foreach ($claves as $clave){                                               
                        $fila[$clave] = $req -> getVal($pref . $clave);
                    }

                    // Introducimos la fecha
                    $fila['created'] = date("Y-m-d H:i:s");

                    // Incluimos la fila local en el contenedor
                    $filas[] = $fila;
                }

                // Insertamos las filas en la base de datos
                if ($dbw -> insert("wikeval", $filas)){
                    $wgOut -> addHTML("<div class='alert alert-success alert-block'><h3 class='alert-heading'>CORRECTO:</h3>");
                    $wgOut -> addHTML("Se añadieron $num_etiquetas etiquetas.</div>");
                } else {
                    $wgOut -> addHTML("<div class='alert alert-error alert-block'><h3 class='alert-heading'>ERROR:</h3>");
                    $wgOut -> addHTML("Hubo un error al intentar insertar las etiquetas.</div>");
                }
                
                $wgOut -> addHTML("Volver al ");
                $wgOut -> addHTML("<a href='" . Article::newFromID($e_article_id) -> getTitle() -> escapeLocalURL() . "'>artículo original</a>.");
                                    
            } else {
            
                $par = trim($par);
                
                if ($par == ""){
                    throw new Exception("No se indicó ninguna página como parámetro para evaluar");
                }
             
                $titulo = Title::newFromText($par);            
                
                if($titulo == null || !$titulo -> exists()){
                    throw new Exception("La página indicada (<em>'$par'</em>) no existe.");                
                }       
                            
                $articulo = Article::newFromID($titulo -> getArticleID());
                
                $wgOut -> addHTML("Pulse aquí para <strong>");
                $wgOut -> addHTML("<a class='btn btn-primary btn-mini' href='" . $articulo -> getTitle() -> escapeLocalURL() . "'>volver al artículo original</a></strong>");
                
                // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                // Parseo del RDF
                
                $rubricas = array();
                
                //$base = dirname(__FILE__) . "http://spi-fm.uca.es/neologism/wikeval.rdf";
                $base = "http://spi-fm.uca.es/neologism/wikeval.rdf";
                
                $dom = new DomDocument;
                $dom -> loadXML(file_get_contents($base));
                
                $xph = new DOMXPath($dom);
                
                $NS_rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
                $NS_rdfs = "http://www.w3.org/2000/01/rdf-schema#";
                 
                $xph -> registerNamespace('rdf', $NS_rdf);
                $xph -> registerNamespace('rdfs', $NS_rdfs);
                
                /*
                $xph -> registerNamespace("owl", "http://www.w3.org/2002/07/owl#");
                $xph -> registerNamespace("dc", "http://purl.org/dc/elements/1.1/");
                $xph -> registerNamespace("vann", "http://purl.org/vocab/vann/");
                $xph -> registerNamespace("foaf", "http://xmlns.com/foaf/0.1/"); //*/
                
                // Buscamos las superclases (la que no tenga un hijo rdfs:subClassOf)
                // Éstas serán las rúbricas
                foreach ($xph -> query('//rdfs:Class[not(rdfs:subClassOf)]') as $rub){
                    $r_actual = array();
                    
                    $r_actual["uri"] = $rub ->  getAttributeNS($NS_rdf, "about");
                    $r_actual["children"] = array();

                    // Con lo fácil que sería buscar por rdfs:label... en fin	
                    $r_label = $rub -> getElementsByTagNameNS($NS_rdfs, "label");
                    
                    // Debería haber una y solo una etiqueta de rdfs:label
                    $r_actual["label"] = $r_label -> item(0) -> textContent;
                    
                    $rubricas[] = $r_actual;
                }
                
                // OJO: En los dos siguientes foreach anidados _NO_ he usado una referencia porque,
                // aunque sería lo más cómodo, me daba un error tipo gato de schrodinger
                
                // Por cada rúbrica, añadimos los conceptos
                foreach($rubricas as $i => $v){		
                    foreach($xph -> query('//rdfs:Class[rdfs:subClassOf/@rdf:resource="' . $rubricas[$i]["uri"] . '"]') 
                        as $concepto){	
                        $nuevo_concepto = array();
                        $nuevo_concepto["uri"] = $concepto -> getAttributeNS($NS_rdf, "about");
                                
                        $c_label = $concepto -> getElementsByTagNameNS($NS_rdfs, "label");
                        $nuevo_concepto["label"] = $c_label -> item(0) -> textContent;
                        
                        $nuevo_concepto["properties"] = array();
                        
                        $rubricas[$i]["children"][] = $nuevo_concepto;
                    }
                    
                    
                    // Recorremos los conceptos de la rúbrica para añadir las propiedades
                    foreach($rubricas[$i]["children"] as $c_i => $c_v){
                    
                        foreach ($xph -> query('//rdf:Property[rdfs:domain/@rdf:resource="' . 
                            $rubricas[$i]["children"][$c_i]["uri"] . '"]') as $propiedad){
                            $nueva_propiedad = array();
                            $nueva_propiedad["uri"] = $propiedad -> getAttributeNS($NS_rdf, "about");
                            
                            $p_label = $propiedad -> getElementsByTagNameNS($NS_rdfs, "label");
                            $nueva_propiedad["label"] = $p_label -> item(0) -> textContent;
                            
                             $rubricas[$i]["children"][$c_i]["properties"][] = $nueva_propiedad;
                        }
                    } //*/
                }

                // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                
                // Aunque coloque aquí esto, mediawiki pone el script al final de la página
                $wgOut -> addInlineScript("var wikeval_rubricas = " . json_encode($rubricas) . ";");
                
                $wgOut -> addHTML("<p class='wikeval'>Estás en la <strong>zona de etiquetado</strong>. En esta zona podrás seleccionar ");
                $wgOut -> addHTML("fragmentos del artículo '<em>$par</em>' y etiquetarlos eligiendo una rúbrica ");
                $wgOut -> addHTML("y un concepto dentro de la misma, al que deberás asignar un valor. También puedes añadir un ");
                $wgOut -> addHTML("comentario al etiquetado. Recuerda que tu nombre de usuario quedará registrado.</p>");
                
                $wgOut -> addHTML("<p class='wikeval'>El proceso es el siguiente. Primero, <strong>elige las atributos</strong> de la etiqueta.
                Luego <strong>selecciona el fragmento</strong> que deseas evaluar en el cuadro de texto. Finalmente <strong>pulsa
                en etiquetar</strong>, la etiqueta se añadirá a la lista de abajo. Cuando hayas terminado, pulsa en el botón 
                <strong>enviar etiquetas</strong> y todas las etiquetas que hayas marcado se enviarán al servidor</p> 
                ");
                
                $wgOut -> addHTML("<fieldset class='wikeval_fieldset' id='wikeval_formulario'>
                    <legend>Atributos de la etiqueta</legend>
                    
                    <div class='wikeval_formulario_controles clearfix'>
                        <div id='wikeval_formulario_izquierda'>

                            <label for='wikeval_formulario_rubrica'>Rúbrica:</label>
                            <select id='wikeval_formulario_rubrica' name='wikeval_formulario_rubrica'></select>
                            
                            <label for='wikeval_formulario_concepto'>Concepto: </label>
                            <select id='wikeval_formulario_concepto' name='wikeval_formulario_concepto'></select>
                            
                            <label for='wikeval_formulario_propiedad'>Propiedad: </label>
                            <select id='wikeval_formulario_propiedad' name='wikeval_formulario_propiedad'></select>
                            
                        </div>
                        
                        <div id='wikeval_formulario_derecha'>

                            <label for='wikeval_formulario_valor'>Valor: </label>
                            <input type='text' id='wikeval_formulario_valor' name='wikeval_formulario_valor' value='0'>
                            
                            <label for='wikeval_formulario_comentario'>Comentario:</label>
                            <textarea id='wikeval_formulario_comentario' name='wikeval_formulario_comentario'></textarea>

                            <input type='hidden' id='wikeval_formulario_articulo' value='{$titulo -> getArticleID()}' readonly>
                            <input type='hidden' id='wikeval_formulario_revision' value='{$articulo -> getRevIdFetched()}' readonly>
                            <input type='hidden' id='wikeval_formulario_usuario'  value='" . $wgUser -> getId() . "' readonly>
                            
                        </div>
                    </div> <!-- .wikeval_formulario_controles -->
                    
                    
                </fieldset>");
                
                $wgOut -> addHTML("<fieldset class='wikeval_fieldset'>
                                     <legend>Etiquetado</legend>
                                     <div id='wikeval_contenedor_textarea' class='wikeval_formulario_controles clearfix'>");

                

                $wgOut -> addHTML("<pre id='wikeval_textarea' readonly>");
                $wgOut -> addHTML( $articulo -> getContent() );
                $wgOut -> addHTML("</pre>");

                $wgOut -> addHTML("<pre id='wikeval_textarea_back'>");
                $wgOut -> addHTML( $articulo -> getContent() );
                $wgOut -> addHTML("</pre>");
                                     
                $wgOut -> addHTML("</div>");
                                     
                $wgOut -> addHTML("<div class='wikeval_formulario_botones'>
                                        <a href='#' id='wikeval_formulario_etiquetar' class='btn btn-primary'><i class='icon-white icon-plus'></i> Añadir etiqueta</a>				
                                    </div>                
                                   </fieldset>");
                
                $wgOut -> addHTML("<fieldset class='wikeval_fieldset'>
                    <legend>Etiquetas a añadir</legend>
                    <div id='wikeval_contenedor_etiquetas'>
                        
                    </div>
                    <div class='wikeval_formulario_botones'>
                        <form id='wikeval_formulario_oculto' action='{$this ->getTitle()->escapeLocalURL()}' method='post'>
                            <input id='wikeval_formulario_enviar' class='btn btn-success' type='submit' value='Enviar etiquetas'>
                        </form>
                    </div>
                    </fieldset>");
            }

        } catch (Exception $e){
            $mensaje = "<div class='alert alert-error alert-block'><h3 class='alert-heading'>ERROR:</h3> {$e -> getMessage()}</div>";
            $wgOut -> addHTML($mensaje);        
        }        
        
        // Cerramos la capa del contenedor
        $wgOut -> addHTML("</div>");
    }
}

?>
